﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using OfficeOpenXml;

namespace RfidCompareWin
{
    internal class ExcelReader
    {
        static public string[] ReadExcelColumn(string filePath, string sheetName, string columnLetter,bool hasHead)
        {
            // 验证文件是否存在
            if (!File.Exists(filePath))
            {
                Console.WriteLine($"错误: 文件不存在 - {filePath}");
                return new string[0];
            }

            // 验证文件扩展名
            var extension = Path.GetExtension(filePath).ToLower();
            if (extension != ".xlsx" && extension != ".xlsm")
            {
                Console.WriteLine($"错误: 不支持的文件格式 - {extension}");
                Console.WriteLine("EPPlus 仅支持 .xlsx 和 .xlsm 格式");
                return new string[0];
            }

            // 配置 EPPlus 许可证（非商业用途可使用免费版）
            ExcelPackage.License.SetNonCommercialPersonal("sun");//个人

            using (var package = new ExcelPackage(new FileInfo(filePath)))
            {
                try
                {
                    // 获取工作表
                    ExcelWorksheet worksheet;
                    if (string.IsNullOrEmpty(sheetName))
                    {
                        worksheet = package.Workbook.Worksheets[0];
                    }
                    else
                    {
                        worksheet = package.Workbook.Worksheets[sheetName];
                    }

                    if (worksheet == null)
                    {
                        Console.WriteLine($"错误: 找不到工作表 - {sheetName ?? "第一个工作表"}");
                        return new string[0];
                    }

                    // 将列字母转换为列索引（例如 "A" -> 1, "B" -> 2）
                    int columnIndex = ColumnLetterToIndex(columnLetter);
                    if (columnIndex <= 0)
                    {
                        Console.WriteLine($"错误: 无效的列字母 - {columnLetter}");
                        return new string[0];
                    }

                    // 确定数据的实际行数
                    int lastRow = worksheet.Dimension?.End.Row ?? 0;
                    if (lastRow == 0)
                    {
                        return new string[0];
                    }

                    // 创建存储数据的列表
                    List<string> dataList = new List<string>();

                    // 确定起始行（跳过标题行）
                    int startRow = !hasHead ? 2 : 1;

                    // 读取列数据
                    for (int row = startRow; row <= lastRow; row++)
                    {
                        var cell = worksheet.Cells[row, columnIndex];
                        string cellText = cell.Text?.Trim() ?? string.Empty;

                        // 可选：跳过空行
                        if (!string.IsNullOrWhiteSpace(cellText))
                        {
                            dataList.Add(cellText);
                        }
                    }

                    return dataList.ToArray();
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"读取 Excel 文件时出错: {ex.Message}");
                    Logger.Instance.Log(ex.Message,level: LogLevel.Error);
                    return new string[0];
                }
            }
        }
        // 辅助方法：将列字母转换为列索引（例如 "A" -> 1, "Z" -> 26, "AA" -> 27）
        private static int ColumnLetterToIndex(string columnLetter)
        {
            if (string.IsNullOrEmpty(columnLetter))
                return 0;

            columnLetter = columnLetter.ToUpper();
            int result = 0;

            foreach (char c in columnLetter)
            {
                result = result * 26 + (c - 'A' + 1);
            }

            return result;
        }
        static public string SelectExcelFile()
        {
            // 创建文件选择对话框实例
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                // 设置对话框标题
                openFileDialog.Title = "选择 Excel 文件";

                // 设置文件过滤器，只显示 Excel 文件
                openFileDialog.Filter = "Excel 文件 (*.xlsx;*.xls)|*.xlsx;*.xls|所有文件 (*.*)|*.*";

                // 设置是否允许多选
                openFileDialog.Multiselect = false;

                // 设置对话框的初始目录（可选）
                // openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

                // 显示对话框并获取用户选择结果
                DialogResult result = openFileDialog.ShowDialog();

                // 如果用户点击了"确定"按钮
                if (result == DialogResult.OK)
                {
                    // 返回用户选择的文件路径
                    return openFileDialog.FileName;
                }

                // 如果用户取消了选择，返回空字符串
                return string.Empty;
            }
        }

        static public void ExportToExcel(string filePath, System.Windows.Forms.ListBox listBox1)
        {
            try
            {
             
                // 配置 EPPlus 许可证（非商业用途可使用免费版）
                ExcelPackage.License.SetNonCommercialPersonal("sun");//个人

                // 创建文件信息对象
                var fileInfo = new FileInfo(filePath);

                // 确保目录存在
                if (!fileInfo.Directory.Exists)
                {
                    fileInfo.Directory.Create();
                }

                // 使用 using 语句确保资源正确释放
                using (var package = new ExcelPackage(fileInfo))
                {
                    // 添加一个工作表
                    var worksheet = package.Workbook.Worksheets.Add("Sheet1");

                    // 假设ListBox中每一项是用逗号分隔的数据
                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        string[] values = listBox1.Items[i].ToString().Split('\n');
                        for (int j = 0; j < values.Length; j++)
                        {
                            worksheet.Cells[i + 1, j + 1].Value = values[j];
                        }
                    }

                    // 自动调整列宽
                    worksheet.Cells.AutoFitColumns();

                    // 保存文件
                    package.Save();
                }

                MessageBox.Show($"数据已成功导出到：{filePath}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"导出过程中发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //如果数据一致则改变其背景色为红色
        static public void ExportToExcel(string oldFilePath, string newFilePath, System.Windows.Forms.ListBox listBox1, string targetColumn, string sheetName)
        {
            try
            {
                // 设置 EPPlus 的许可证上下文（非商业用途）
                ExcelPackage.License.SetNonCommercialPersonal("sun");//个人

                // 检查源文件是否存在
                var oldFileInfo = new FileInfo(oldFilePath);
                if (!oldFileInfo.Exists)
                {
                    MessageBox.Show($"源文件不存在：{oldFilePath}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                // 创建新文件的目录
                var newFileInfo = new FileInfo(newFilePath);
                if (!newFileInfo.Directory.Exists)
                {
                    newFileInfo.Directory.Create();
                }

                // 将ListBox内容转换为字符串集合
                var listBoxItems = listBox1.Items.Cast<object>()
                                               .Select(item => item.ToString())
                                               .ToList();

                // 将列索引字母转换为数字
                int columnNumber = ColumnLetterToIndex(targetColumn);

                // 打开现有Excel文件
                using (var package = new ExcelPackage(oldFileInfo))
                {
                    // 获取指定工作表
                    var worksheet = package.Workbook.Worksheets[sheetName];
                    if (worksheet == null)
                    {
                        MessageBox.Show($"指定的工作表不存在：{sheetName}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    // 获取工作表数据范围
                    var range = worksheet.Dimension;
                    if (range != null)
                    {
                        // 遍历指定列的所有行
                        for (int row = 1; row <= range.Rows; row++)
                        {
                            var cellValue = worksheet.Cells[row, columnNumber].Value?.ToString() ?? "";

                            // 如果单元格值存在于ListBox中，则标红
                            if (listBoxItems.Contains(cellValue))
                            {
                                worksheet.Cells[row, columnNumber].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                                worksheet.Cells[row, columnNumber].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Red);
                            }
                        }
                    }

                    // 自动调整列宽
                    worksheet.Cells.AutoFitColumns();

                    // 保存为新文件（不覆盖原文件）
                    package.SaveAs(newFileInfo);
                }

                MessageBox.Show($"数据已成功导出到：{newFilePath}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"导出过程中发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



    }

}
